package com.luxsoft.sw3.gasoc.model;

import java.util.Calendar;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

import org.apache.commons.lang.time.DateUtils;
import org.hibernate.annotations.Parent;
import org.hibernate.annotations.Type;
import org.hibernate.validator.NotNull;

import com.luxsoft.siipap.model.BaseBean;
import com.luxsoft.siipap.model.core.Producto;
import com.luxsoft.siipap.util.DateUtil;

@Embeddable
public class ServicioPorSocio extends BaseBean{

	
	@Parent
	private Socio socio;
	
	@ManyToOne (optional=false)
	@JoinColumn (name="PRODUCTO_ID",nullable=false,updatable=false)
	@NotNull(message="Seleccione el servicio ")
	private Producto producto;
	
	@Column(name="INSCRIPCION")
	@Type(type="date")
	private Date inscripcion=new Date();
	
	@Column(name="PROXIMO_PAGO")
	@Type(type="date")
	private Date proximoPago = new Date();
	
	@Column(name="SUSPENDIDO")
	private boolean suspendido=false;
	
	@Column(name="FECHA_SUSPENSION")
	@Type(type="date")
	private Date fechaSuspension;
	
	@Column(name="DIA_PAGO")
	   // @Length (max=100)
	private int diaPago=getDiaDePago();
		
	@Column(name = "ESPECIAL")
	private boolean especial = false;

	public Socio getSocio() {
		return socio;
	}

	public void setSocio(Socio socio) {
		this.socio = socio;
	}

	public Producto getProducto() {
		return producto;
	}

	public void setProducto(Producto producto) {
		Object old = this.producto;
		this.producto = producto;
		firePropertyChange("producto", old, producto);
		if(producto.getClase().getId()==7L){
			setEspecial(true);
			}
	}

	public Date getInscripcion() {
		return inscripcion;
	}

	public void setInscripcion(Date inscripcion) {
	
		Object old = this.inscripcion;
		this.inscripcion = inscripcion;
		firePropertyChange("inscripcion", old, inscripcion);
	}

	public Date getProximoPago() {
		return proximoPago;
	}

	public void setProximoPago(Date proximoPago) {
		
		Object old = this.proximoPago;
		this.proximoPago = proximoPago;
		firePropertyChange("proximoPago", old, proximoPago);
		
	}

	public boolean isSuspendido() {
		return suspendido;
	}

	public void setSuspendido(boolean suspendido) {
		this.suspendido = suspendido;
		setFechaSuspension(suspendido?new Date():null);
	}

	public Date getFechaSuspension() {
		return fechaSuspension;
	}

	public void setFechaSuspension(Date fechaSuspension) {
		Object old = this.fechaSuspension;
		this.fechaSuspension = fechaSuspension;
		firePropertyChange("fechaSuspension", old,fechaSuspension);
		
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((producto == null) ? 0 : producto.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		ServicioPorSocio other = (ServicioPorSocio) obj;
		if (producto == null) {
			if (other.producto != null)
				return false;
		} else if (!producto.equals(other.producto))
			return false;
		return true;
	}

	public void actualizarProximoPago(){
		actualizarProximoPago(getProximoPago());
	}

	public void actualizarProximoPago(final Date fecha){
		if(getProducto()!=null){
			int meses=getProducto().getMesesDeServicio();
			int diaDePago=getDiaPago();
			Calendar c=Calendar.getInstance();
			c.setTime(fecha);
			c.set(Calendar.DATE, diaDePago);
			Date prox=DateUtils.addMonths(c.getTime(), meses);
			setProximoPago(prox);
		}
	}
	
	public void actualizarProximoPagoPorCancelacion(){
		
		actualizarProximoPagoPorCancelacion(getProximoPago());
	}
	
	public void actualizarProximoPagoPorCancelacion(final Date fecha){
		
		if(getProducto()!=null){
			
			int meses=-getProducto().getMesesDeServicio();
			int diaDePago=getDiaPago();
			Calendar c=Calendar.getInstance();
			c.setTime(fecha);
			c.set(Calendar.DATE, diaDePago);
			Date prox=DateUtils.addMonths(c.getTime(),meses);
			setProximoPago(prox);
		}
	}
	
	private int getDiaDePago(){
		Calendar c=Calendar.getInstance();
		c.setTime(new Date());
		c.getTime();
		return c.get(Calendar.DATE);
	}

	public Integer getDiaPago() {
		return diaPago;
	}

	public void setDiaPago(Integer diaPago) {
		Object old = this.diaPago;
		this.diaPago = diaPago;
		firePropertyChange("diaPago", old, diaPago);
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "";
	}
	
	public boolean isEspecial() {
		return especial;
	}

	public void setEspecial(boolean especial) {
		this.especial = especial;
	}
}
